package com.aimusic.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Base64;
import java.util.Date;
import java.util.Map;

@Component // 声明为Spring组件，由Spring管理实例
public class JwtUtils {

    // 1. 移除static修饰符，Spring的@Value无法注入静态字段
    @Value("${jwt.sign-key}")
    private String base64SignKey;

    @Value("${jwt.expire}")
    private Long expire; // 注意变量名是expire（小写）

    // 2. 密钥获取方法改为非静态，依赖非静态的base64SignKey
    private SecretKey getSecretKey() {
        if (base64SignKey == null || base64SignKey.isEmpty()) {
            throw new IllegalArgumentException("JWT签名密钥未配置，请检查application.yml中的jwt.sign-key");
        }
        // 解码Base64密钥
        byte[] keyBytes = Base64.getDecoder().decode(base64SignKey);
        // 验证密钥长度（256位=32字节，HS256必需）
        if (keyBytes.length != 32) {
            throw new IllegalArgumentException("JWT签名密钥必须是256位（32字节），当前长度：" + keyBytes.length + "字节");
        }
        return Keys.hmacShaKeyFor(keyBytes);
    }

    /**
     * 生成JWT令牌（改为非静态方法，依赖Spring注入的配置）
     */
    public String generateJwt(Map<String, Object> claims) {
        if (expire == null || expire <= 0) {
            throw new IllegalArgumentException("JWT过期时间配置无效，请检查application.yml中的jwt.expire");
        }
        return Jwts.builder()
                .addClaims(claims)
                .signWith(getSecretKey(), SignatureAlgorithm.HS256)
                .setExpiration(new Date(System.currentTimeMillis() + expire)) // 引用非静态的expire
                .compact();
    }

    /**
     * 解析JWT令牌（改为非静态方法）
     */
    public Claims parseJWT(String jwt) throws JwtException {
        return Jwts.parserBuilder()
                .setSigningKey(getSecretKey())
                .build()
                .parseClaimsJws(jwt)
                .getBody();
    }
}
